package cn.stu.framework.service;


import cn.stu.common.utils.ApiData;
import cn.stu.framework.dto.FileDto;
import cn.stu.framework.entity.File;
import com.baomidou.mybatisplus.extension.service.IService;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InsufficientDataException;
import io.minio.errors.InvalidResponseException;
import io.minio.errors.XmlParserException;
import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.rmi.ServerException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * 文件服务接口
 *
 * @author 郑志豪
 * @date 2023/09/12
 */
public interface FileService extends IService<File> {

    /**
     * 按实体列出
     * 通过文件实体分页查询所有文件
     *
     * @param pageNumber 页号
     * @param pageSize   页大小
     * @param dto        DTO
     * @return 文件列表
     */
    ApiData listByEntity(int pageNumber, int pageSize, FileDto dto);

    /**
     * 通过ID获取文件
     *
     * @param id       文件ID
     * @param response Http响应
     * @return {@link ApiData}
     * @throws IOException               S3操作I/O错误
     * @throws InvalidKeyException       缺少HMAC SHA-256库
     * @throws InvalidResponseException  S3服务器返回无效响应
     * @throws InsufficientDataException 输入流没有足够的有效数据
     * @throws NoSuchAlgorithmException  缺少MD5或SHA-256摘要库
     * @throws ServerException           HTTP服务器错误
     * @throws InternalException         内部库错误
     * @throws XmlParserException        XML解析错误
     * @throws ErrorResponseException    S3服务器返回错误响应
     */
    ApiData getById(Long id, HttpServletResponse response) throws IOException, InvalidKeyException, InvalidResponseException,
            InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException, io.minio.errors.ServerException, io.minio.errors.InternalException;

    /**
     * 创建文件
     *
     * @param multipartFile 二进制文件
     * @param file          文件实例
     * @return 文件实例
     * @throws IOException               S3操作I/O错误
     * @throws InvalidKeyException       缺少HMAC SHA-256库
     * @throws InvalidResponseException  S3服务器返回无效响应
     * @throws InsufficientDataException 输入流没有足够的有效数据
     * @throws NoSuchAlgorithmException  缺少MD5或SHA-256摘要库
     * @throws ServerException           HTTP服务器错误
     * @throws InternalException         内部库错误
     * @throws XmlParserException        XML解析错误
     * @throws ErrorResponseException    S3服务器返回错误响应
     */
    ApiData create(MultipartFile multipartFile, File file) throws IOException, InvalidKeyException, InvalidResponseException,
            InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException, io.minio.errors.ServerException, io.minio.errors.InternalException;


    /**
     * 更新文件
     *
     * @param file 文件实例
     * @return 文件实例
     */
    ApiData update(File file);

    /**
     * 通过ID删除文件
     *
     * @param id 文件ID
     * @return {@link ApiData}
     * @throws IOException               S3操作I/O错误
     * @throws InvalidKeyException       缺少HMAC SHA-256库
     * @throws InvalidResponseException  S3服务器返回无效响应
     * @throws InsufficientDataException 输入流没有足够的有效数据
     * @throws NoSuchAlgorithmException  缺少MD5或SHA-256摘要库
     * @throws ServerException           HTTP服务器错误
     * @throws InternalException         内部库错误
     * @throws XmlParserException        XML解析错误
     * @throws ErrorResponseException    S3服务器返回错误响应
     */
    ApiData deleteById(Long id) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException,
            NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException;

}